/* 
 * File:   Parameters.h
 * Author: Gab'z
 *
 * Created on 27 mai 2012, 17:41
 */

#ifndef PARAMETERS_H
#define	PARAMETERS_H

namespace calculator {
    const int MIN_VISIBLE_STACK_SIZE = 2;
    const int MAX_VISIBLE_STACK_SIZE = 10;

    class Parameters {
    public:

        /**
         * Unité de l'angle pour les opérateurs angulaires.
         * 2 unités disponibles, DEGREE est choisi par défaut.
         */
        enum AngleUnit {
            DEGREE = 0, /**< Angles en degrés. */
            RADIAN = 1 /**< Angles en radians. */
        };

        /**
         * Type de constante utilisé dans les calculs.
         * Essentiellement utilisé lors des divisions pour déterminer le type de résultat attendu.
         * 3 types disponibles, INTEGER est choisi par défaut.
         */
        enum ConstantType {
            INTEGER = 0, /**< mode entier. */
            RATIONNAL = 1, /**< mode rationnel. */
            REAL = 2 /**< mode réel. */
        };

        /**
         * Singleton Parameters.
         * @return crée et/ou renvoie l'instance de Parameters.
         */
        static Parameters* getInstance();
        
        /**
         * Singleton Parameters.
         * Détruit l'instance de Parameters.
         */
        static void deleteInstance();

        /**
         * Constructeur de recopie de Parameters
         */
        Parameters(const Parameters& orig);
        
        /**
         * Constructeur de Parameters détaillé
         * @param constantType
         * @param angleUnit
         * @param complexMode
         * @param displayKeyboard
         * @param visibleStackSize
         * @param instantCompute
         * @param integerDivision
         * @param saveOnExit
         */
        Parameters(ConstantType constantType,
                AngleUnit angleUnit,
                bool complexMode,
                bool displayKeyboard,
                int visibleStackSize,
                bool instantCompute,
                bool integerDivision,
                bool saveOnExit);
        virtual ~Parameters();

        /**
         * Clone l'instance de Parameters en vue de la sauvegarder
         * @return une copie des paramètres dans un objet Parameters
         */
        Parameters* clone() const;

        // <editor-fold defaultstate="collapsed" desc="GETTER/SETTER">

        ConstantType getConstantType() const {
            return _constantType;
        }

        void setConstantType(ConstantType constantType) {
            _constantType = constantType;
        }

        AngleUnit getAngleUnit()const {
            return _angleUnit;
        }

        void setAngleUnit(AngleUnit angleUnit) {
            _angleUnit = angleUnit;
        }

        bool getComplexMode() const {
            return _complexMode;
        }

        void setComplexMode(bool complexMode) {
            _complexMode = complexMode;
        }

        bool getDisplayKeyboard()const {
            return _displayKeyboard;
        }

        void setDisplayKeyboard(bool displayKeyboard) {
            _displayKeyboard = displayKeyboard;
        }

        unsigned int getVisibleStackSize() const {
            return _visibleStackSize;
        }

        void setVisibleStackSize(int visibleStackSize) {
            _visibleStackSize = visibleStackSize;
        }

        bool getInstantCompute() const {
            return _instantCompute;
        }

        void setInstantCompute(bool instantCompute) {
            _instantCompute = instantCompute;
        }

        bool getIntegerDivision() const {
            return _integerDivision;
        }

        void setIntegerDivision(bool integerDivision) {
            _integerDivision = integerDivision;
        }

        bool getSaveOnExit() const {
            return _saveOnExit;
        }

        void setSaveOnExit(bool saveOnExit) {
            _saveOnExit = saveOnExit;
        }// </editor-fold>

    private:

        /**
         * Singleton Parameters.
         * Le desgin pattern est respecté à moitié, il ne peut y avoir 
         * qu'un seul objet Parameters pour le Context, mais la sauvegarde 
         * et le chargement se trouvent facilités par la possibilité de créer 
         * des objets paramètres en dehors du contexte.
         */
        static Parameters* instance;

        /**
         * Le type de Constant utilisé.
         * @see ConstantType
         */
        ConstantType _constantType;

        /**
         * L'unité utilisée pour les opérations angulaires.
         * @see AngleUnit
         */
        AngleUnit _angleUnit;

        /**
         * Mode complexe.
         */
        bool _complexMode;

        /**
         * Option clavier affiché.
         */
        bool _displayKeyboard;

        /**
         * Nombre de Constant visibles par Stack.
         * compris entre 2 et 10.
         */
        int _visibleStackSize;

        /**
         * Option calcul immédiat.
         * Si activé, l'appui sur une touche du clavier 
         * de l'interface lance immédiatement le calcul.
         */
        bool _instantCompute;

        /**
         * Option division entière
         * Si activée    : 4 5 / => 0 (0/1)
         * Si désactivée : 4 5 / => 4/5
         */
        bool _integerDivision;

        /**
         * Option sauvegarder à la sortie.
         */
        bool _saveOnExit;

        /**
         * Constructeur de Parameters
         * Valeurs par défaut :
         * - _constantType = REAL;
         * - _angleUnit = DEGREE;
         * - _complexMode = false;
         * - _displayKeyboard = true;
         * - _visibleStackSize = 10;
         * - _instantCompute = true;
         * - _integerDivision = false;
         * - _saveOnExit = true;
         */
        Parameters();
    };

}
#endif	/* PARAMETERS_H */

